home *** CD-ROM | disk | FTP | other *** search
- /*--------------------------------------------------------------------------*
- __ __
- / / / /__ $RCSfile: clock.c,v $
- ______ / / ______ ______ / // / $Revision: 1.9 $
- \/ / ____// / / __ // ____// _ / $Date: 1994/01/12 07:46:51 $
- / /___ / /_ / /_/ // /___ / /| | $Author: tf $
- /_____//___//_____//_____//_/ |_| $State: Exp $
-
- (c) Copyright 1993 Tobias Ferber, All Rights Reserved.
-
- *--------------------------------------------------------------------------*/
-
- #include <exec/types.h>
- #include <exec/ports.h>
- #include <exec/libraries.h>
- #include <libraries/dos.h>
- #include <intuition/intuition.h>
- #include <time.h>
- #include <stdio.h>
- #include "timer.h"
-
- #define NUMDIGITS 8 /* HH:MM:SS */
- #define DHEIGHT 14
- #define DWIDTH 16
- #define DDIST 5 /* gap between digits */
-
- /*#define DEBUG*/
- /*#define AMIGA36*/
- /*#define CTIME*/
-
- static char rcs_id[] = "$VER: $Id: clock.c,v 1.9 1994/01/12 07:46:51 tf Exp $";
-
- extern int do_vclock(); /* area.o */
- extern SHORT *digits[10], *colon, *nomp; /* digits.S => chip memory */
- static struct IntuitionBase *IntuitionBase= (struct IntuitionBase *)NULL;
- static struct Image lcd[8];
- BOOL fromWB= FALSE;
-
- /* init_screenclock() is where we init our lcd[] array */
-
- void init_screenclock(void)
- { int i;
- for(i=0;i<NUMDIGITS;i++)
- { lcd[i].LeftEdge = i*(DWIDTH+DDIST);
- lcd[i].TopEdge = 0;
- lcd[i].Width = DWIDTH;
- lcd[i].Height = DHEIGHT;
- lcd[i].Depth = 2;
- lcd[i].ImageData = (i==2||i==5) ? colon : digits[0];
- lcd[i].PlanePick = 3;
- lcd[i].PlaneOnOff= 0;
- lcd[i].NextImage = (i==(NUMDIGITS-1)) ? (struct Image *)NULL : &lcd[i+1];
- }
- }
-
- /* display the current time (hh:mm:ss) in w's RastPort */
-
- void set_screenclock(struct Window *w, int h, int m, int s)
- {
- static int _h=0,_m=0,_s=0;
-
- if(h!=_h || m!=_m || s!=_s)
- { lcd[0].ImageData= digits[h/10];
- lcd[1].ImageData= digits[h%10];
- lcd[3].ImageData= digits[m/10];
- lcd[4].ImageData= digits[m%10];
- lcd[6].ImageData= digits[s/10];
- lcd[7].ImageData= digits[s%10];
-
- DrawImage(w->RPort, &lcd[0], (w->Width - NUMDIGITS*(DWIDTH+DDIST))/2,
- (w->Height - DHEIGHT)/2 );
- _h=h; _m=m; _s=s;
- }
- }
-
- #ifdef CTIME
- #include <libraries/diskfont.h>
- #include <graphics/text.h>
-
- ULONG *DiskfontBase= (ULONG *)NULL;
-
- void setdiskfont(struct RastPort *rp, char *fname, int fsize)
- {
- if(DiskfontBase= (ULONG *)OpenLibrary("diskfont.library",0L))
- { struct TextFont *tf;
- struct TextAttr ta;
- ta.ta_Name= fname;
- ta.ta_YSize= fsize;
- ta.ta_Style= FS_NORMAL;
- ta.ta_Flags= FPF_DISKFONT;
- if(tf= (struct TextFont *)OpenDiskFont(&ta))
- SetFont(rp,tf);
- CloseLibrary(DiskfontBase);
- }
- }
-
- void render_ctime(struct Window *w, long t)
- { char *s= ctime(&t);
- int l= 24; /* strlen(s) */
- SetAPen(w->RPort,3L);
- Move(w->RPort, (w->Width - TextLength(w->RPort,s,l))/2,
- 3*(w->Height - w->RPort->TxHeight)/4 );
- Text(w->RPort, s,l);
- }
- #endif
-
- #define REDSCALE 0 /* const for do_screenclock() */
- #define GREENSCALE 4
- #define BLUESCALE 8
- #define GREYSCALE 12
- #define LCDSCALE 16
-
- static short color_table[] = { 0x000,0x500,0x500,0xF00, /* red table */
- 0x000,0x050,0x050,0x0F0, /* green table */
- 0x029,0x555,0x555,0xFFF, /* blue table */
- 0x000,0x555,0x555,0xFFF, /* grey table */
- 0xCBA,0xBA9,0xBA9,0x543, /* lcd table */
- 0x029,0x029,0x029,0xFF0, /* blue+yellow */
- };
-
-
- static struct NewScreen ns= { 0,0, 640,256, 2, 0,0,
- HIRES,CUSTOMSCREEN|SCREENQUIET,
- NULL,NULL,NULL,NULL
- };
-
- static struct NewWindow nw= { 0,0, 0,0, -1,-1,
- MOUSEBUTTONS|RAWKEY|INTUITICKS|MOUSEMOVE,
- BACKDROP|BORDERLESS|RMBTRAP|REPORTMOUSE|ACTIVATE,
- NULL,NULL,NULL,NULL,NULL,
- -1,-1,-1,-1,CUSTOMSCREEN
- };
-
- /*
- * Here we do the screen clock stuff. ct should be the first index
- * of one of the color_table[] ranges (e.g. REDSCALE)
- * do_screenlock() needs the global IntuitionBase ptr to open the screen
- * and show/update the clock until a MOUSEBUTTONS event comes up.
- */
-
- void do_screenclock(int ct)
- {
- IntuitionBase= (struct IntuitionBase *)OpenLibrary("intuition.library",0L);
- if(IntuitionBase)
- { struct timerequest *tr= (struct timerequest *)NULL;
-
- #ifdef AMIGA36 /* couldn't get this through DICE */
- #include <graphics/displayinfo.h>
- if( ((struct Library *)IntuitionBase)->lib_Version >= 36L)
- { struct GfxBase *GfxBase= (struct GfxBase *)OpenLibrary("graphics.library",0L);
- if(GfxBase)
- { struct Screen *lps= (struct Screen *)LockPubScreen("Workbench");
- ULONG modeID= GetVPModeID(&lps->ViewPort);
- if(modeID!=NULL && modeID!=INVALID_ID)
- ns.ViewModes= (UWORD)modeID; /* problem? */
- else ns.ViewModes= lps->ViewPort.Modes;
-
- ns.Width= lps->Width;
- ns.Height= lps->Height;
-
- UnLockPubScreen(NULL,lps);
- CloseLibrary(GfxBase);
- }
- }
- else
- #endif
-
- { struct Screen ws; /* Workbench Screen data */
- if(GetScreenData(&ws,sizeof(struct Screen),WBENCHSCREEN,NULL))
- { ns.Width= ws.Width;
- ns.Height= ws.Height;
- ns.ViewModes= ws.ViewPort.Modes;
- }
- }
- if((tr= open_timer(NULL,0L)) != (struct timerequest *)NULL)
- { struct MsgPort *tp= tr->tr_node.io_Message.mn_ReplyPort;
- queue_timer(tr,1,0);
- struct Screen *scr= (struct Screen *)NULL;
- if(scr= (struct Screen *)OpenScreen(&ns))
- { struct Window *win= (struct Window *)NULL;
- nw.Screen= scr;
- nw.Width= ns.Width;
- nw.Height= ns.Height;
- LoadRGB4(&scr->ViewPort,&color_table[4*(ct%6)],1L<<(ns.Depth));
- if(win= (struct Window *)OpenWindow(&nw))
- { struct IntuiMessage *imsg;
- BOOL done= FALSE;
- #ifdef CTIME
- setdiskfont(win->RPort,"times.font",24);
- #endif
- init_screenclock();
- SetPointer(win,nomp,1,1,0,0);
- while(!done)
- { ULONG class;
- long timersigmask = (1L << tp->mp_SigBit),
- usersigmask = (1L << win->UserPort->mp_SigBit),
- breaksigmask = SIGBREAKF_CTRL_C,
-
- sig= Wait(timersigmask | usersigmask | breaksigmask);
-
- done |= (sig & breaksigmask);
-
- if(sig & timersigmask)
- { while(GetMsg(tp) != (struct Message *)NULL)
- ;
- if(CheckIO((struct IORequest *)&tr->tr_node))
- { long t;
- struct tm *lt;
- time(&t);
- lt= (struct tm *)localtime(&t);
- set_screenclock(win,lt->tm_hour,lt->tm_min,lt->tm_sec);
- #ifdef CTIME
- render_ctime(win,t);
- #endif
- queue_timer(tr,1,0);
- }
- }
- if(sig & usersigmask)
- { while(imsg= (struct IntuiMessage *)GetMsg(win->UserPort))
- { class= imsg->Class;
- ReplyMsg((struct Message *)imsg);
- done |= (class==MOUSEBUTTONS ||
- class==RAWKEY ||
- class==MOUSEMOVE);
- }
- }
- }
- ClearPointer(win);
- CloseWindow(win);
- }
- CloseScreen(scr);
- }
- purge_timer(tr);
- close_timer(tr);
- }
- CloseLibrary(IntuitionBase);
- }
- }
-
- static char *howtouse[]= {
- "X", "/N", "-x", "opening position; left edge (default 0)",
- "Y", "/N", "-y", " top edge (default 0)",
- "WIDTH", "/N", "-w", "initial window size; width (default 350)",
- "HEIGHT", "/N", "-h", " height (default 55)",
- "SETPEN", "/N", "-s", "pen used for set segments (default 2)",
- "UNSETPEN", "/N", "-u", " for unset segments (default 3)",
- "OUTLINE", "/N", "-o", " for segment's outline (default 0)",
- "BACKFILL", "/N", "-b", " to fill the background (default 3)",
-
- "BORDERLESS", "/S", "-i", "don't render the window border",
- "BACKDROP", "/S", "-d", "force vclock to be behind all other windows",
- "NOTITLE", "/S", "-t", "don't display the date in the window title",
- "NOGADGETS", "/S", "-g", "do not render system gadgets",
-
- "BLANK", "/N", "-q", "open screen and show clock w/ given colour table",
- NULL, NULL, NULL, NULL
- };
-
- main(int argc, char *argv[])
- {
- BOOL badopt= FALSE; /* bad command line option? */
-
- /* defaults */
-
- short x = 0,
- y = 0,
- w = 350,
- h = 55,
- s = 2,
- u = 3,
- o = 0,
- b = 3,
- t = 0,
- q = -1;
-
- long f = WINDOWCLOSE|WINDOWDEPTH|WINDOWSIZING|WINDOWDRAG;
-
- #ifdef DEBUG
- FILE *fp= fopen("RAM:options","w");
- if(fp)
- { int i=0;
- fprintf(fp,"argc= %d\n",argc);
- for(i=0;i<argc;i++)
- fprintf(fp,"argv[%d]= \"%s\"\n",i,argv[i]);
- fclose(fp);
- }
- #endif
-
- if(argc>1)
- { --argc;
- ++argv;
-
- while(argc>0 && !badopt)
- { char *arg= argv[0];
- if(isalpha(*arg))
- { char **aopt= &howtouse[0];
- while(*aopt && stricmp(arg,*aopt))
- aopt= &aopt[4];
- if(*aopt) arg= aopt[2];
- }
- if(*arg=='-')
- { arg++;
- switch(*arg)
- {
- /* -x */ case 'x': case 'X':
- if(arg[1]) x= (short)atoi(&arg[1]);
- else
- { argv++;
- argc--;
- if(argc>0) x= (short)atoi(argv[0]);
- else { puts("Error: missing x-position value after keyword");
- badopt=TRUE;
- }
- }
- if(x<0)
- { printf("Illegal left edge value %d\n",x);
- badopt= TRUE;
- }
- break;
- /* -y */ case 'y': case 'Y':
- if(arg[1]) y= (short)atoi(&arg[1]);
- else
- { argv++;
- argc--;
- if(argc>0) y= (short)atoi(argv[0]);
- else { puts("Error: missing y-position value after keyword");
- badopt=TRUE;
- }
- }
- if(y<0)
- { printf("Illegal top edge value %d\n",y);
- badopt= TRUE;
- }
- break;
- /* -w */ case 'w': case 'W':
- if(arg[1]) w= (short)atoi(&arg[1]);
- else
- { argv++;
- argc--;
- if(argc>0) w= (short)atoi(argv[0]);
- else { puts("Error: missing width value after keyword");
- badopt=TRUE;
- }
- }
- if(w<0)
- { printf("Illegal WIDTH value %d\n",w);
- badopt= TRUE;
- }
- break;
- /* -h */ case 'h': case 'H':
- if(arg[1]) h= (short)atoi(&arg[1]);
- else
- { argv++;
- argc--;
- if(argc>0) h= (short)atoi(argv[0]);
- else { puts("Error: missing height value after keyword");
- badopt=TRUE;
- }
- }
- if(h<0)
- { printf("Illegal HEIGTH value %d\n",h);
- badopt= TRUE;
- }
- break;
- /* -s */ case 's': case 'S':
- if(arg[1]) s= (short)atoi(&arg[1]);
- else
- { argv++;
- argc--;
- if(argc>0) s= (short)atoi(argv[0]);
- else { puts("Error: missing set pen value after keyword");
- badopt=TRUE;
- }
- }
- if(s<0 || s>255)
- { printf("Illegal SET pen %d -- should be in [0..255]\n",s);
- badopt= TRUE;
- }
- break;
- /* -u */ case 'u': case 'U':
- if(arg[1]) u= (short)atoi(&arg[1]);
- else
- { argv++;
- argc--;
- if(argc>0) u= (short)atoi(argv[0]);
- else { puts("Error: missing unset pen value after keyword");
- badopt=TRUE;
- }
- }
- if(u<0 || u>255)
- { printf("Illegal UNSET pen %d -- should be in [0..255]\n",u);
- badopt= TRUE;
- }
- break;
- /* -o */ case 'o': case 'O':
- if(arg[1]) o= (short)atoi(&arg[1]);
- else
- { argv++;
- argc--;
- if(argc>0) o= (short)atoi(argv[0]);
- else { puts("Error: missing outline pen value after keyword");
- badopt=TRUE;
- }
- }
- if(o<0 || o>255)
- { printf("Illegal OUTLINE pen %d -- should be in [0..255]\n",o);
- badopt= TRUE;
- }
- break;
- /* -b */ case 'b': case 'B':
- if(arg[1]) b= (short)atoi(&arg[1]);
- else
- { argv++;
- argc--;
- if(argc>0) b= (short)atoi(argv[0]);
- else { puts("Error: missing backfill value after keyword");
- badopt=TRUE;
- }
- }
- if(b<0 || b>255)
- { printf("Illegal BACKFILL pen %d -- should be in [0..255]\n",b);
- badopt= TRUE;
- }
- break;
- /* -i */ case 'i': case 'I':
- if(f & WINDOWCLOSE)
- f = BORDERLESS;
- else
- f |= BORDERLESS;
- break;
- /* -d */ case 'd': case 'D':
- if(f & WINDOWCLOSE)
- f = BACKDROP;
- else
- f |= BACKDROP;
- break;
- /* -t */ case 't': case 'T':
- t= 1;
- break;
- /* -g */ case 'g': case 'G':
- f = 0;
- break;
- /* -q */ case 'q': case 'Q':
- if(arg[1]) t= (short)atoi(&arg[1]);
- else
- { argv++;
- argc--;
- if(argc>0) q= (short)atoi(argv[0]);
- else q=0;
- }
- break;
- case '?':
- puts(&rcs_id[6]);
- puts("Written by Tobias Ferber for the PUBLIC DOMAIN");
- puts("Refer to vClock.DOC for options. ? for AmigaDOS help");
- badopt= TRUE;
- break;
- /* ?? */ default:
- printf("bad option -%c.\n",*arg);
- badopt= TRUE;
- break;
- }
- }
- else if(*arg=='?')
- { char **usage= &howtouse[0];
- while(*usage)
- { printf("%s%s,",usage[0],usage[1]);
- usage= &usage[4];
- }
- printf("\b:\n\n");
- usage= &howtouse[0];
- while(*usage)
- { printf("%-10s or '%s' %s\n",usage[0],usage[2],usage[3]);
- usage= &usage[4];
- }
- exit(0);
- }
- else
- { printf("Unknown keyword %s\n",arg);
- badopt= TRUE;
- }
- --argc;
- ++argv;
- }
- }
- if(!badopt)
- { if(q>=0) do_screenclock(q);
- else if( do_vclock(x,y,w,h,s,u,o,b,t,f) )
- puts("vClock failed.");
- }
- if(!fromWB) exit(badopt ? 20:0);
- }
-
- #include <workbench/workbench.h>
- #include <workbench/startup.h>
- #include <workbench/icon.h>
-
- struct IconBase *IconBase;
-
- wbmain(struct WBStartup *WBStartup)
- {
- int ac= 0; /* argument counter */
- char *av[13*2]; /* argument value: 12 keywords, 12 values */
- fromWB= TRUE;
-
- IconBase= (struct IconBase *)OpenLibrary(ICONNAME,LIBRARY_VERSION);
- if(IconBase)
- { struct WBArg *wbarg= WBStartup->sm_ArgList;
- struct DiskObject *icon;
- av[ac++]= (char *)wbarg->wa_Name;
- CurrentDir(wbarg->wa_Lock);
- icon= GetDiskObject(wbarg->wa_Name);
- if(icon)
- { char *ttv, **tt= icon->do_ToolTypes,
- **usage= &howtouse[0];
-
- while(*usage)
- { ttv= FindToolType(tt,*usage);
- if(ttv)
- { av[ac++]= *usage;
- if(usage[1][1] != 'S')
- av[ac++]= ttv;
- }
- usage= &usage[4];
- }
- (void)main(ac,av);
- FreeDiskObject(icon);
- }
- /* else (we got no icon) -> we were not started from Workbench */
- CloseLibrary(IconBase);
- }
- else
- { av[ac++]= "[icon.library is hiding]";
- (void)main(ac,av);
- }
- }
-